藍牙技術就像是你手機或其他設備之間的「無線對話」,它能讓設備之間在不需要任何電線的情況下,互相傳送資料。這種「對話」使用的是無線電波,但與我們聽到的收音機不同,藍牙使用的無線電波範圍非常短,通常只在10米內有效。
主要原理:
配對:當你想讓兩個設備(例如手機和藍牙耳機)連接時,首先需要「配對」。這有點像是你要先交換聯絡方式,兩個設備才能認識彼此,這樣它們才能進行安全的通訊。
低功耗:藍牙的設計重點之一就是低功耗,這意味著它非常省電,特別適合小型設備,如耳機、手錶或運動追蹤器。
頻率跳頻:為了避免其他無線設備(如 Wi-Fi)干擾藍牙,它會不斷改變自己使用的頻率,就像是在一堆擁擠的頻道裡,快速地切換到比較清晰的頻道,確保訊號不會被干擾。
小範圍網絡:藍牙可以讓多個設備形成一個小型的無線網絡,稱為「Piconet」。在這個網絡裡,最多可以有 7 個設備互相連接,就像是朋友之間的小群組,每個人都能互相交流。
傳輸數據:當設備連接後,它們可以傳送各種數據,例如音樂、檔案或訊息。這些數據會被打包成「小封包」,通過無線電波送到另一個設備,然後再被解開來使用。
常見應用:
import time
import bluetooth
from micropython import const
_IRQ_SCAN_RESULT = const(5)
_IRQ_SCAN_DONE = const(6)
def bt_irq(event, data):
if event == _IRQ_SCAN_RESULT:
# A single scan result.
addr_type, addr, connectable, rssi, adv_data = data
print(':'.join(['%02X' % i for i in addr]))
elif event == _IRQ_SCAN_DONE:
# Scan duration finished or manually stopped.
print('scan complete')
# Scan for 10s (at 100% duty cycle)
ms_scan = 10000
bt = bluetooth.BLE()
bt.irq(bt_irq)
bt.active(True)
bt.gap_scan(ms_scan, 30000, 30000)
time.sleep_ms(ms_scan)
import ubluetooth
import time
class ESP32_Bluetooth:
def __init__(self):
self.bt = ubluetooth.BLE()
self.bt.active(True)
self.bt.irq(self.bt_irq)
self.scan_results = None
self.conn = None
def bt_irq(self, event, data):
if event == 1: # BLE.IRQ_SCAN_RESULT
addr_type, addr, adv_type, rssi, adv_data = data
if b'WiFiBoy_B' in adv_data: # 找到機器B
self.scan_results = addr
self.bt.gap_scan(None) # 停止掃描
elif event == 7: # BLE.IRQ_PERIPHERAL_CONNECT
self.conn = data
elif event == 8: # BLE.IRQ_PERIPHERAL_DISCONNECT
self.conn = None
def scan(self):
self.bt.gap_scan(2000, 30000, 30000) # 開始掃描2秒
def connect(self):
if self.scan_results:
self.bt.gap_connect(0, self.scan_results)
def send_message(self, message):
if self.conn:
self.bt.gattc_write(self.conn, 0x0010, message.encode('utf-8'), 1)
def receive_message(self):
if self.conn:
return self.bt.gattc_read(self.conn, 0x0010)
def close(self):
if self.conn:
self.bt.gap_disconnect(self.conn)
# 程序執行
bt_a = ESP32_Bluetooth()
bt_a.scan()
time.sleep(2)
bt_a.connect()
time.sleep(1)
bt_a.send_message("你好!我是玩學機A,請問你是誰?")
while True:
received = bt_a.receive_message()
if received:
print("收到:", received)
response = input("輸入訊息發送給B:")
bt_a.send_message(response)